package com.kaifamiao.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import java.util.Iterator;

/**
 * 1、钝化(Passivate)
 *    钝化也被称作持久化，即将会话对象从容器所管理内存中驱逐至其它位置(比如磁盘)
 *    将 会话对象 从 容器管理的内存 中 保存 到 磁盘、数据库或其它设备的过程就是 钝化
 *    比如 Tomcat 管理的内存中有正在使用的会话对象，如果此时关闭 Tomcat ，则 Tomcat会将会话中的数据保存至磁盘
 * 2、激活(Activate)
 *    会话的 激活 也被称作会话的 锐化 或 活化 ，即将其它位置保存的会话数据重新读取到容器管理的内存中
 *    读取其它位置保存的会话数据并将其恢复到 容器所管理的内存中的过程 就是 激活 (锐化)
 *    比如 重新启动 Tomcat 时，Tomcat 会从默认的位置读取会话数据，并将这些数据恢复到 Tomcat 管理的内存中
 */
@WebListener
public class SessionActivationListener implements HttpSessionActivationListener {

    // 当 会话对象 将要 钝化(Passivate) 时就会调用 sessionWillPassivate 方法
    @Override
    public void sessionWillPassivate( HttpSessionEvent event ) {
        System.out.println( "会话即将钝化" );
        HttpSession session = event.getSession();
        Iterator<String> iterator = session.getAttributeNames().asIterator();
        System.out.println( "即将被保存到磁盘的属性:" );
        while( iterator.hasNext() ) {
            String name = iterator.next();
            Object value = session.getAttribute( name );
            System.out.println( name + " = " + value );
        }
    }

    // 当 会话对象 已经被 激活 时就会调用 sessionDidActivate 方法
    @Override
    public void sessionDidActivate( HttpSessionEvent event ) {
        System.out.println( "会话已经被激活" );
        HttpSession session = event.getSession();
        Iterator<String> iterator = session.getAttributeNames().asIterator();
        System.out.println( "已经恢复到会话对象中的属性:" );
        while( iterator.hasNext() ) {
            String name = iterator.next();
            Object value = session.getAttribute( name );
            System.out.println( name + " = " + value );
        }
    }

}
